<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
      /* 
      手机号
      1、11位数字
      2、1开头
      3、第二位是3-9
       */
      //  let reg = /^1[3-9]\d{9}$/
      //  let num = '15031418888';


      /* 
      有效数字
      2 +2 -2  0  2.5   -21.5    3.01415926   3.1
      1、开头可以是 +或者- （可有可无，如果有只能出现一次） [+-]?   出现0到1次
      2、数字有可能是1位数，也有可能是多位数   (\d|[1-9]\d+)  
      3、小数部分     (\.\d+)?
      
       */
      //  let reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;
                       
      // //  test:他是正则类原型上的一个方法
     
      //  console.log(reg.test('23.1')); // true
      //  console.log(reg.test('23.1.1')); // false
      //  console.log(reg.test('0')); // true
      //  console.log(reg.test('023')); // false

      /* 
      密码：
        1、6-18位组成
        2、由数字，字母，下划线组成
        let reg = /^\w{6,18}$/
       */
      // let str = 'rtyu567&';
      //  function fn(str){
      //     // if(str.length<6 || str.length>18){
      //     //   alert('密码不符合规则');
      //     //   return;
      //     // }
      //     // let ary =['r','1','a','_','.....'];
      //     // for(var i = 0;i<str.length;i++){
      //     //   if(!ary.includes(str[i])){
      //     //       alert('密码不符合规则');
      //     //       return;
      //     //   }
      //     // }
      //     let reg = /^\w{6,18}$/;
      //     if(!reg.test(str)){
      //       alert('密码不符合规则');
      //       return;
      //     }

      //  }
      //  fn(str)


      /* 
      匹配姓名
        宋小宝
        宋尊
        东方不败
        喜塔腊·尔晴
        上杉绘梨衣
        爱新觉罗·溥仪
        希林那依·高
        阿诺德·施瓦辛格·溥仪
        尼古拉斯·赵四
        [\u4E00-\u9FA5]
       */
      //  let reg = /[\u4E00-\u9FA5]{2,6}(·[\u4E00-\u9FA5]{1,6}){0,10}/;

      /* 
      身份证
      1、18位
      3、前六位：省市区
      4、7到14位：出生年月日
      5、最后四位：
          1、前两位：带出所的代码
          2、第三位：奇数是男孩，偶数是女孩
          3、第四位：有可能是数字，也有可能是X
       */

      //  年  [1-2]\d{3}
      //  月   01-12   01-09  10-12  (0[1-9]|1[0-2])
      //  日   01-31   01-09 10-29  30-31  (0[1-9]|[1-2][0-9]|3[0-1])
        
      // ([0 - 2][1 - 9]) | 10 | 20 | 30 | 31)


      //  let reg = /^\d{17}(\d|X)$/;

      //     reg = /^(\d{6})(\d{8})(\d{2})(\d{1})(\d|X)$/;
      //     reg = /^(?:\d{6})([1-2]\d{3})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])(?:\d{2})(\d{1})(?:\d|X)$/;

       let str = '11011100010318238X';
       function fn(str){
         let reg = /^(?:\d{6})([1-2]\d{3})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])(?:\d{2})(\d{1})(?:\d|X)$/;
         let res = reg.exec(str);
         // 如果捕获不到是null
         if(!res){
           console.log('对不起，你的身份证号有误，请重新输入');
           return;
         }
         // ["11011120010318237X", "2001", "03", "18", "7", index: 0, input: "11011120010318237X", groups: undefined]
         let sex = res[4] %2 === 0? '女孩' :'男孩';
         return `你的生日是${res[1]}年${res[2]}月${res[3]}日，你的性别是${sex}`
       }
       console.log(fn(str)); // xxxx年xx月xx日 你的性别是x

      //  ()
      //  1、提高匹配的优先级
      // 2、分组引用
      // 3、分组捕获
      // ?:只匹配不捕获

      //  console.log(reg.test(str));
      //  console.log(reg.exec(str));

  </script>
</body>
</html>